#include <head.h>

// 定义信号量
sem_t semA;
sem_t semB;
sem_t semC;

void *sem_func_A(void *val) 
{
    printf("线程A 开始工作......\n");
    sleep(2); // 睡2秒
    sem_post(&semA); // 释放信号量，允许线程A执行
    return NULL;
}

void *sem_func_B(void *val) 
{
    sem_wait(&semA); // 等待信号量，确保在A完成后执行
    printf("线程B 开始工作......\n");
    sleep(2); // 睡2秒
    sem_post(&semB); // 释放信号量，允许线程C执行
    return NULL;
}

void *sem_func_C(void *val) 
{
    sem_wait(&semB); // 等待信号量，确保在B完成后执行
    printf("线程C 开始工作......\n");
    sleep(2); // 睡2秒
    return NULL;
}

int main(int argc, char const *argv[]) 
{
    pthread_t TidA;
    pthread_t TidB;
    pthread_t TidC;

    // 初始化信号量
    sem_init(&semA, 0, 0);
    sem_init(&semB, 0, 0);
    sem_init(&semC, 0, 0);

    // 创建线程
    pthread_create(&TidA, NULL, sem_func_A, NULL);
    pthread_create(&TidB, NULL, sem_func_B, NULL);
    pthread_create(&TidC, NULL, sem_func_C, NULL);

    // 等待线程结束
    pthread_join(TidA, NULL);
    pthread_join(TidB, NULL);
    pthread_join(TidC, NULL);

    // 销毁信号量
    sem_destroy(&semA);
    sem_destroy(&semB);
    sem_destroy(&semC);

    printf("流水线已完成\n");
    return 0;
}
